load
library(forecast)
Attaching package: ‘forecast’
The following object is masked _by_ ‘.GlobalEnv’:
gold
dja <- read_csv("data/DJA.csv",skip = 4)
gold <- read_csv("data/GOLD_1791-2018.csv",skip = 3)
interest_rate <- read_csv("data/INTERESTRATE_1857-2018.csv",skip = 1)
sap <- read_csv("data/SAP_1871-2018.csv", skip=1)
cpi <- read_csv("data/USCPI_1774-2018.csv", skip=4)
gdp <- read_csv("data/USGDP_1790-2018.csv", skip=2)
wage <- read_csv("data/USWAGE_1774-2018.csv", skip=3)
Down Jones Avg
el dja es una serie diaria, todas las demás son anuales.
dja <- dja %>%
mutate(Date = parse_date_time(Date,orders = "mdy"))
ggplotly(ggplot(dja,aes(Date, DJIA))+
geom_line()) %>%
layout(legend = list(
orientation = "h"))
summary(dja)
Date DJIA
Min. :1885-05-02 00:00:00 Min. : 24.36
1st Qu.:1916-02-09 06:00:00 1st Qu.: 70.41
Median :1946-10-14 12:00:00 Median : 199.28
Mean :1949-03-11 07:36:39 Mean : 2354.03
3rd Qu.:1982-06-06 06:00:00 3rd Qu.: 1002.07
Max. :2018-09-10 00:00:00 Max. :26616.71
dja %>%
mutate(dif = (DJIA - lag(DJIA, default = DJIA[1]))/lag(DJIA, default = DJIA[1])) %>%
ggplot(.,aes(Date, dif))+
geom_rect(fill="firebrick",
xmin=parse_date_time("01-01-1930",orders = "mdy"),
xmax=parse_date_time("01-01-1940",orders = "mdy"),
ymin=-1,
ymax=1,
alpha=0.5)+
geom_line()

armo una lista de las crisis conocidas
url <- "https://www.caproasia.com/2016/04/12/economic-crisis-since-1900-2015/"
crisis <- url %>%
read_html() %>%
html_nodes(css = 'table') %>%
html_table(header = T)
crisis <- crisis[[1]] %>%
filter(Affected %in% c("United States","Global")) %>%
separate(Period,c("desde","hasta")," – ")
Expected 2 pieces. Missing pieces filled with `NA` in 10 rows [1, 4, 5, 6, 7, 8, 9, 10, 11, 12].
#en realidad las que terminan en "s" no duran toda la década. Las agrego a mano.
# mutate(hasta = parse_date_time(case_when(grepl("s",desde)~as.numeric(str_extract(desde,"[[:digit:]]*"))+10,
# TRUE~ as.numeric(hasta)),"y"),
# desde = parse_date_time(str_extract(desde,"[[:digit:]]*"),"y"))
crisis <- crisis %>%
mutate(hasta = parse_date_time(case_when(desde=="1970s"~"1979",
desde=="1980s"~"1982",
desde == "1990s"~"1991",
TRUE~hasta),"y"),
desde = parse_date_time(case_when(desde=="1970s"~"1973",
desde=="1980s"~"1981",
desde=="1990s"~"1990",
TRUE~desde),"y"))
crisis_largas <- na.omit(crisis)
crisis_puntuales <- crisis %>%
filter(is.na(hasta))
dja <- dja %>%
mutate(dif = (DJIA - lag(DJIA, default = DJIA[1]))/lag(DJIA, default = DJIA[1]))
ggplot()+
geom_rect(data= crisis_largas,
aes(xmin=crisis_largas$desde,
xmax=crisis_largas$hasta),
fill="firebrick",
ymin=-1,
ymax=1,
alpha=0.5)+
geom_line(data = dja,aes(Date, dif))+
geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")

NA
Este gráfico me da la sensación de que todo estuviera corrido a la derecha (mirando las crisis puntuales vs los picos)
Gold
gold %>%
ggplot(., aes(Year, `New York Market Price (U.S. dollars per fine ounce)`))+
geom_line()+
geom_vline(xintercept = 1971, color = "red")+
geom_label_repel(data=data_frame(),aes(x=1971,y=1000,label="Fin del patrón oro"),nudge_x = -5,force=10)

interest_rate
- La tasa de largo plazo es una serie mucho más suave (eso es un dato conocido de finanzas no?)
- Los surplus funds también parecen ser más volátiles hasta los 40
sap
sap %>%
summary()
Year The S&P Index Average for January Annual Yield The Accumulated S&P Index Average for January
Min. :1871 Min. : 3.240 Min. :1.140 Min. : 1.0
1st Qu.:1908 1st Qu.: 7.433 1st Qu.:3.310 1st Qu.: 11.5
Median :1944 Median : 16.430 Median :4.500 Median : 122.0
Mean :1944 Mean : 261.888 Mean :4.356 Mean : 21442.8
3rd Qu.:1981 3rd Qu.: 122.058 3rd Qu.:5.390 3rd Qu.: 5360.0
Max. :2018 Max. :2791.730 Max. :8.710 Max. :298189.7
NA's :1
sap %>%
gather(type, value,2:4) %>%
mutate(type= case_when(type=="The S&P Index Average for January"~"The S&P Index\nAverage for January",
type=="The Accumulated S&P Index Average for January"~"The Accumulated S&P\nIndex Average for January",
TRUE~type)) %>%
ggplot(.,aes(Year,value, color=type))+
geom_line()+
facet_grid(type~.,scale="free")+
theme(legend.position = "bottom",
strip.text.y = element_text(angle = 0))

ts(sap$`Annual Yield`, start=min(sap$Year), frequency = 1) %>%
na.omit() %>%
auto.arima(.)
Series: .
ARIMA(0,1,2)
Coefficients:
ma1 ma2
-0.0141 -0.3007
s.e. 0.0802 0.0810
sigma^2 estimated as 0.4111: log likelihood=-141.37
AIC=288.73 AICc=288.9 BIC=297.68
CPI
cpi %>%
ggplot(aes(Year,`U.S. Consumer Price Index *`))+
geom_line()

gdp

me interesa ver el PBI normalizado por el crecimiento poblacional, y además normalizado por la cantidad de oro que puede comprar (en lugar de normalizar por el CPI):
gdp <- left_join(gold, gdp, by = "Year") %>%
mutate(gdp_in_gold = `Nominal GDP per capita (current dollars)`/`New York Market Price (U.S. dollars per fine ounce)`,
Year = parse_date_time(Year,"y"))
ggplotly(ggplot(gdp,aes(Year,gdp_in_gold))+
geom_line())
A partir del 1900 pareciera que se arman 3 ciclos muy largos
- 1914-1933
- 1933-1980
- 1980-2012
Agregando referencias históricas de las crisis conocidas

La guerra de sesesión de EEUU fué entre el 12 de abril de 1861 y el 9 de abril de 1865
A partir de ahí el pbi en oro crece hasta el fin del patron oro.
wage
wage %>%
summary()
Year Costs of Unskilled Labor (index 1860 = 100)
Min. :1774 Min. : 31.00
1st Qu.:1835 1st Qu.: 79.65
Median :1896 Median : 143.50
Mean :1896 Mean : 2499.49
3rd Qu.:1956 3rd Qu.: 1682.75
Max. :2017 Max. :19640.40
Production Workers Hourly Compensation (nominal dollars)
Min. : 0.020
1st Qu.: 0.060
Median : 0.150
Mean : 3.906
3rd Qu.: 2.555
Max. :32.390
NA's :16
Podemos deflactar el salario horario por el CPI
El salario real tiene una tendencia creciente hasta el 78’ y allí se estanca hasta el 2013

Se ven los mismos tres períodos. Pero a diferencia del GDP, el período 1980-2012 tiene un nivel más bajo que el anterior.
¿ Si quisieramos comparar ingrsos con algún revenue tendríamos usar S&P o DJA?
LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgbG9hZAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHJ2ZXN0KQpsaWJyYXJ5KHBsb3RseSkKYGBgCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmRqYSA8LSByZWFkX2NzdigiZGF0YS9ESkEuY3N2Iixza2lwID0gNCkKZ29sZCA8LSByZWFkX2NzdigiZGF0YS9HT0xEXzE3OTEtMjAxOC5jc3YiLHNraXAgPSAzKQppbnRlcmVzdF9yYXRlIDwtIHJlYWRfY3N2KCJkYXRhL0lOVEVSRVNUUkFURV8xODU3LTIwMTguY3N2Iixza2lwID0gMSkKc2FwIDwtIHJlYWRfY3N2KCJkYXRhL1NBUF8xODcxLTIwMTguY3N2Iiwgc2tpcD0xKQpjcGkgPC0gcmVhZF9jc3YoImRhdGEvVVNDUElfMTc3NC0yMDE4LmNzdiIsIHNraXA9NCkKZ2RwIDwtIHJlYWRfY3N2KCJkYXRhL1VTR0RQXzE3OTAtMjAxOC5jc3YiLCBza2lwPTIpCndhZ2UgPC0gcmVhZF9jc3YoImRhdGEvVVNXQUdFXzE3NzQtMjAxOC5jc3YiLCBza2lwPTMpCmBgYAoKCiMjIERvd24gSm9uZXMgQXZnCmVsIGRqYSBlcyB1bmEgc2VyaWUgZGlhcmlhLCB0b2RhcyBsYXMgZGVtw6FzIHNvbiBhbnVhbGVzLgoKYGBge3J9CmRqYSA8LSBkamEgJT4lIAogIG11dGF0ZShEYXRlID0gcGFyc2VfZGF0ZV90aW1lKERhdGUsb3JkZXJzID0gIm1keSIpKQoKZ2dwbG90bHkoZ2dwbG90KGRqYSxhZXMoRGF0ZSwgREpJQSkpKwogIGdlb21fbGluZSgpKSAlPiUgCiAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoCiAgICAgIG9yaWVudGF0aW9uID0gImgiKSkKCnN1bW1hcnkoZGphKQpgYGAKCgpgYGB7cn0KCmRqYSAlPiUgCiAgbXV0YXRlKGRpZiA9IChESklBIC0gbGFnKERKSUEsIGRlZmF1bHQgPSBESklBWzFdKSkvbGFnKERKSUEsIGRlZmF1bHQgPSBESklBWzFdKSkgJT4lIApnZ3Bsb3QoLixhZXMoRGF0ZSwgZGlmKSkrCiAgZ2VvbV9yZWN0KGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB4bWluPXBhcnNlX2RhdGVfdGltZSgiMDEtMDEtMTkzMCIsb3JkZXJzID0gIm1keSIpLAogICAgICAgICAgICB4bWF4PXBhcnNlX2RhdGVfdGltZSgiMDEtMDEtMTk0MCIsb3JkZXJzID0gIm1keSIpLAogICAgICAgICAgICB5bWluPS0xLAogICAgICAgICAgICB5bWF4PTEsCiAgICAgICAgICAgIGFscGhhPTAuNSkrCiAgICBnZW9tX2xpbmUoKQoKYGBgCgphcm1vIHVuYSBsaXN0YSBkZSBsYXMgY3Jpc2lzIGNvbm9jaWRhcwoKYGBge3J9CnVybCA8LSAiaHR0cHM6Ly93d3cuY2Fwcm9hc2lhLmNvbS8yMDE2LzA0LzEyL2Vjb25vbWljLWNyaXNpcy1zaW5jZS0xOTAwLTIwMTUvIgpjcmlzaXMgPC0gdXJsICU+JQogIHJlYWRfaHRtbCgpICU+JSAKICBodG1sX25vZGVzKGNzcyA9ICd0YWJsZScpICU+JSAKICBodG1sX3RhYmxlKGhlYWRlciA9IFQpCgpjcmlzaXMgPC0gY3Jpc2lzW1sxXV0gJT4lIAogIGZpbHRlcihBZmZlY3RlZCAlaW4lIGMoIlVuaXRlZCBTdGF0ZXMiLCJHbG9iYWwiKSkgJT4lIAogIHNlcGFyYXRlKFBlcmlvZCxjKCJkZXNkZSIsImhhc3RhIiksIiDigJMgIikKCgojZW4gcmVhbGlkYWQgbGFzIHF1ZSB0ZXJtaW5hbiBlbiAicyIgbm8gZHVyYW4gdG9kYSBsYSBkw6ljYWRhLiBMYXMgYWdyZWdvIGEgbWFuby4KICAjIG11dGF0ZShoYXN0YSA9IHBhcnNlX2RhdGVfdGltZShjYXNlX3doZW4oZ3JlcGwoInMiLGRlc2RlKX5hcy5udW1lcmljKHN0cl9leHRyYWN0KGRlc2RlLCJbWzpkaWdpdDpdXSoiKSkrMTAsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRX4gYXMubnVtZXJpYyhoYXN0YSkpLCJ5IiksCiAgIyAgICAgICAgZGVzZGUgPSBwYXJzZV9kYXRlX3RpbWUoc3RyX2V4dHJhY3QoZGVzZGUsIltbOmRpZ2l0Ol1dKiIpLCJ5IikpCgpjcmlzaXMgPC0gY3Jpc2lzICU+JSAKICBtdXRhdGUoaGFzdGEgPSBwYXJzZV9kYXRlX3RpbWUoY2FzZV93aGVuKGRlc2RlPT0iMTk3MHMifiIxOTc5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzZGU9PSIxOTgwcyJ+IjE5ODIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNkZSA9PSAiMTk5MHMifiIxOTkxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRX5oYXN0YSksInkiKSwKICAgICAgICAgZGVzZGUgPSBwYXJzZV9kYXRlX3RpbWUoY2FzZV93aGVuKGRlc2RlPT0iMTk3MHMifiIxOTczIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzZGU9PSIxOTgwcyJ+IjE5ODEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNkZT09IjE5OTBzIn4iMTk5MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUV+ZGVzZGUpLCJ5IikpCgoKYGBgCgoKCgpgYGB7cn0KY3Jpc2lzX2xhcmdhcyA8LSBuYS5vbWl0KGNyaXNpcykKY3Jpc2lzX3B1bnR1YWxlcyA8LSBjcmlzaXMgJT4lIAogIGZpbHRlcihpcy5uYShoYXN0YSkpCgoKZGphIDwtIGRqYSAlPiUgCiAgbXV0YXRlKGRpZiA9IChESklBIC0gbGFnKERKSUEsIGRlZmF1bHQgPSBESklBWzFdKSkvbGFnKERKSUEsIGRlZmF1bHQgPSBESklBWzFdKSkgCmdncGxvdCgpKwogIGdlb21fcmVjdChkYXRhPSBjcmlzaXNfbGFyZ2FzLCAKICAgICAgICAgICAgYWVzKHhtaW49Y3Jpc2lzX2xhcmdhcyRkZXNkZSwKICAgICAgICAgICAgeG1heD1jcmlzaXNfbGFyZ2FzJGhhc3RhKSwKICAgICAgICAgICAgZmlsbD0iZmlyZWJyaWNrIiwgCiAgICAgICAgICAgIHltaW49LTEsCiAgICAgICAgICAgIHltYXg9MSwKICAgICAgICAgICAgYWxwaGE9MC41KSsKICAgIGdlb21fbGluZShkYXRhID0gZGphLGFlcyhEYXRlLCBkaWYpKSsKICBnZW9tX3ZsaW5lKGRhdGE9Y3Jpc2lzX3B1bnR1YWxlcywgYWVzKHhpbnRlcmNlcHQ9ZGVzZGUpLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZT0iZGFzaGVkIikKICAKCmBgYAoKCkVzdGUgZ3LDoWZpY28gbWUgZGEgbGEgc2Vuc2FjacOzbiBkZSBxdWUgdG9kbyBlc3R1dmllcmEgY29ycmlkbyBhIGxhIGRlcmVjaGEgKG1pcmFuZG8gbGFzIGNyaXNpcyBwdW50dWFsZXMgdnMgbG9zIHBpY29zKQoKIyMgR29sZAoKYGBge3J9CmdvbGQgJT4lIAogIGdncGxvdCguLCBhZXMoWWVhciwgYE5ldyBZb3JrIE1hcmtldCBQcmljZSAoVS5TLiBkb2xsYXJzIHBlciBmaW5lIG91bmNlKWApKSsKICBnZW9tX2xpbmUoKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTcxLCBjb2xvciA9ICJyZWQiKSsKICBnZW9tX2xhYmVsX3JlcGVsKGRhdGE9ZGF0YV9mcmFtZSgpLGFlcyh4PTE5NzEseT0xMDAwLGxhYmVsPSJGaW4gZGVsIHBhdHLDs24gb3JvIiksbnVkZ2VfeCA9IC01LGZvcmNlPTEwKQpgYGAKCgojIyBpbnRlcmVzdF9yYXRlCgoKYGBge3J9CmdyYWYgPC0gaW50ZXJlc3RfcmF0ZSAlPiUgCiAgZ2F0aGVyKHR5cGUscmF0ZSwyOjQpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKFllYXIscmF0ZSxjb2xvcj10eXBlKSkrCiAgZ2VvbV9saW5lKCkrCiAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChucm93PTIsYnlyb3c9VFJVRSkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpnZ3Bsb3RseShncmFmKSAlPiUKICBsYXlvdXQobGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIKICAgICkKICApCmBgYAoKLSBMYSB0YXNhIGRlIGxhcmdvIHBsYXpvIGVzIHVuYSBzZXJpZSBtdWNobyBtw6FzIHN1YXZlIChlc28gZXMgdW4gZGF0byBjb25vY2lkbyBkZSBmaW5hbnphcyBubz8pCi0gTG9zIHN1cnBsdXMgZnVuZHMgdGFtYmnDqW4gcGFyZWNlbiBzZXIgbcOhcyB2b2zDoXRpbGVzIGhhc3RhIGxvcyA0MAoKCiMjIHNhcAoKCmBgYHtyfQpzYXAgJT4lIAogIHN1bW1hcnkoKQpzYXAgJT4lIAogIGdhdGhlcih0eXBlLCB2YWx1ZSwyOjQpICU+JQogIG11dGF0ZSh0eXBlPSBjYXNlX3doZW4odHlwZT09IlRoZSBTJlAgSW5kZXggQXZlcmFnZSBmb3IgSmFudWFyeSJ+IlRoZSBTJlAgSW5kZXhcbkF2ZXJhZ2UgZm9yIEphbnVhcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT09IlRoZSBBY2N1bXVsYXRlZCBTJlAgSW5kZXggQXZlcmFnZSBmb3IgSmFudWFyeSJ+IlRoZSBBY2N1bXVsYXRlZCBTJlBcbkluZGV4IEF2ZXJhZ2UgZm9yIEphbnVhcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgVFJVRX50eXBlKSkgJT4lIAogIGdncGxvdCguLGFlcyhZZWFyLHZhbHVlLCBjb2xvcj10eXBlKSkrCiAgZ2VvbV9saW5lKCkrCiAgZmFjZXRfZ3JpZCh0eXBlfi4sc2NhbGU9ImZyZWUiKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwKSkKCmBgYAoKCgpgYGB7cn0KdHMoc2FwJGBBbm51YWwgWWllbGRgLCBzdGFydD1taW4oc2FwJFllYXIpLCBmcmVxdWVuY3kgPSAxKSAlPiUgCiAgbmEub21pdCgpICU+JQogIGF1dG8uYXJpbWEoLikKCmBgYAoKIyMgQ1BJCgpgYGB7cn0KY3BpICU+JSAKICBnZ3Bsb3QoYWVzKFllYXIsYFUuUy4gQ29uc3VtZXIgUHJpY2UgSW5kZXggKmApKSsKICBnZW9tX2xpbmUoKQpgYGAKCiMjIGdkcApgYGB7cn0KZ2RwICU+JSAKICBnZ3Bsb3QoYWVzKFllYXIsYFJlYWwgR0RQIHBlciBjYXBpdGEgKHllYXIgMjAxMiBkb2xsYXJzKWApKSsKICBnZW9tX2xpbmUoKQpgYGAKCgoKbWUgaW50ZXJlc2EgdmVyIGVsIFBCSSBub3JtYWxpemFkbyBwb3IgZWwgY3JlY2ltaWVudG8gcG9ibGFjaW9uYWwsIHkgYWRlbcOhcyBub3JtYWxpemFkbyBwb3IgbGEgY2FudGlkYWQgZGUgb3JvIHF1ZSBwdWVkZSBjb21wcmFyIChlbiBsdWdhciBkZSBub3JtYWxpemFyIHBvciBlbCBDUEkpOgoKYGBge3J9CgoKZ2RwIDwtIGxlZnRfam9pbihnb2xkLCBnZHAsIGJ5ID0gIlllYXIiKSAlPiUgCiAgbXV0YXRlKGdkcF9pbl9nb2xkID0gYE5vbWluYWwgR0RQIHBlciBjYXBpdGEgKGN1cnJlbnQgZG9sbGFycylgL2BOZXcgWW9yayBNYXJrZXQgUHJpY2UgKFUuUy4gZG9sbGFycyBwZXIgZmluZSBvdW5jZSlgLAogICAgICAgICBZZWFyID0gcGFyc2VfZGF0ZV90aW1lKFllYXIsInkiKSkgCiAgCmdncGxvdGx5KGdncGxvdChnZHAsYWVzKFllYXIsZ2RwX2luX2dvbGQpKSsKICBnZW9tX2xpbmUoKSkKYGBgCgpBIHBhcnRpciBkZWwgMTkwMCBwYXJlY2llcmEgcXVlIHNlIGFybWFuIDMgY2ljbG9zIG11eSBsYXJnb3MKCi0gMTkxNC0xOTMzCi0gMTkzMy0xOTgwCi0gMTk4MC0yMDEyCgoKQWdyZWdhbmRvIHJlZmVyZW5jaWFzIGhpc3TDs3JpY2FzIGRlIGxhcyBjcmlzaXMgY29ub2NpZGFzCgpgYGB7cn0KbGlicmFyeShzY2FsZXMpICMgdG8gYWNjZXNzIGJyZWFrcy9mb3JtYXR0aW5nIGZ1bmN0aW9ucwpnZ3Bsb3QoKSsKZ2VvbV9yZWN0KGRhdGE9IGNyaXNpc19sYXJnYXMsIAogICAgICAgICAgICBhZXMoeG1pbj1jcmlzaXNfbGFyZ2FzJGRlc2RlLAogICAgICAgICAgICB4bWF4PWNyaXNpc19sYXJnYXMkaGFzdGEpLAogICAgICAgICAgICBmaWxsPSJmaXJlYnJpY2siLCAKICAgICAgICAgICAgeW1pbj0tSW5mLAogICAgICAgICAgICB5bWF4PUluZiwKICAgICAgICAgICAgYWxwaGE9MC41KSsKICBnZW9tX2xpbmUoZGF0YSA9IGdkcCAlPiUgCiAgICAgICAgICAgICAgZmlsdGVyKFllYXI+cGFyc2VfZGF0ZV90aW1lKDE5MDAsInkiKSkKICAgICAgICAgICAgLGFlcyhZZWFyLCBnZHBfaW5fZ29sZCkpKwogIGdlb21fdmxpbmUoZGF0YT1jcmlzaXNfcHVudHVhbGVzLCBhZXMoeGludGVyY2VwdD1kZXNkZSksIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBwYXJzZV9kYXRlX3RpbWUoMTk3MSwieSIpLGNvbG9yID0gImdvbGQiKSsgI2ZpbiBkZWwgcGF0cm9uIG9ybwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiMTUgeWVhcnMiLGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWSIpICkKYGBgCgpMYSBndWVycmEgZGUgc2VzZXNpw7NuIGRlIEVFVVUgZnXDqSBlbnRyZSBlbCAxMiBkZSBhYnJpbCBkZSAxODYxIHkgZWwgOSBkZSBhYnJpbCBkZSAxODY1IAoKQSBwYXJ0aXIgZGUgYWjDrSBlbCBwYmkgZW4gb3JvIGNyZWNlIGhhc3RhIGVsIGZpbiBkZWwgcGF0cm9uIG9yby4KCiMjIHdhZ2UKCmBgYHtyfQp3YWdlICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpQb2RlbW9zIGRlZmxhY3RhciBlbCBzYWxhcmlvIGhvcmFyaW8gcG9yIGVsIENQSQoKYGBge3J9CmdncGxvdGx5KAp3YWdlICU+JSAKICBsZWZ0X2pvaW4oY3BpLGJ5PSJZZWFyIikgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAgbXV0YXRlKHNhbGFyaW9faG9yYXJpb19yZWFsID0gYFByb2R1Y3Rpb24gV29ya2VycyBIb3VybHkgQ29tcGVuc2F0aW9uIChub21pbmFsIGRvbGxhcnMpYC9gVS5TLiBDb25zdW1lciBQcmljZSBJbmRleCAqYCkgJT4lIAogIGdncGxvdCguLGFlcyhZZWFyLHNhbGFyaW9faG9yYXJpb19yZWFsKSkrCiAgZ2VvbV9saW5lKCkgCiAgKQpgYGAKCgpFbCBzYWxhcmlvIHJlYWwgdGllbmUgdW5hIHRlbmRlbmNpYSBjcmVjaWVudGUgaGFzdGEgZWwgNzgnIHkgYWxsw60gc2UgZXN0YW5jYSBoYXN0YSBlbCAyMDEzCgoKCmBgYHtyfQp3YWdlICU+JSAKICBmaWx0ZXIoWWVhcj49MTkwMCkgJT4lIAogIGxlZnRfam9pbihnb2xkLCBnZHAsIGJ5ID0gIlllYXIiKSAlPiUgCiAgbXV0YXRlKHdnX2luX2dvbGQgPSBgUHJvZHVjdGlvbiBXb3JrZXJzIEhvdXJseSBDb21wZW5zYXRpb24gKG5vbWluYWwgZG9sbGFycylgL2BOZXcgWW9yayBNYXJrZXQgUHJpY2UgKFUuUy4gZG9sbGFycyBwZXIgZmluZSBvdW5jZSlgLAogICAgICAgICBZZWFyID0gcGFyc2VfZGF0ZV90aW1lKFllYXIsInkiKSkgJT4lIAogIG5hLm9taXQoKSAlPiUgCmdncGxvdCguLGFlcyhZZWFyLHdnX2luX2dvbGQpKSsKICBnZW9tX2xpbmUoKQpgYGAKClNlIHZlbiBsb3MgbWlzbW9zIHRyZXMgcGVyw61vZG9zLiBQZXJvIGEgZGlmZXJlbmNpYSBkZWwgR0RQLCBlbCBwZXLDrW9kbyAxOTgwLTIwMTIgdGllbmUgdW4gbml2ZWwgbcOhcyBiYWpvIHF1ZSBlbCBhbnRlcmlvci4gCiAKCsK/IFNpIHF1aXNpZXJhbW9zIGNvbXBhcmFyIGluZ3Jzb3MgY29uIGFsZ8O6biByZXZlbnVlIHRlbmRyw61hbW9zIHVzYXIgUyZQIG8gREpBPwoKCgo=